package com.wc.alorithm_blue_bridge._思维.Q3416;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Stack;

/**
 * @Author congge
 * @Date 2023/11/22 21:41
 * @description
 * 四元组问题
 * https://www.lanqiao.cn/problems/3416/learning/?page=1&first_category_id=1
 */
public class Main {
    public static void main(String[] args) {
        Input sc = new Input();
        int n = sc.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }
        // minR[i] 表示右边最小数，确定后面有没有c   nums[d] < nums[c] < nums[a] < nums[b]
        int[] minR = new int[n];
        for (int i = n - 2; i >= 0; i--) {
            minR[i] = Math.min(minR[i + 1], nums[i]);
        }
        Stack<Integer> stack = new Stack<>();
        // k 存的是nums[a]
        int k = Integer.MIN_VALUE;
        for (int i = 0; i < n; i++) {
            // 这里如果成立就说明会 nums[c] < nums[a]
            if (nums[i] < k){
                // 这里成立就说明有 num[d] < nums[c]
                if (nums[i] > minR[i]){
                    System.out.println("YES");
                    return;
                }
            }
            // k 存的是次大值，如果说有一个nums[i]比最大值还大,那我们需要找到比最大值小一点的次大值
            // 栈顶元素是nums[b]
            while (!stack.isEmpty()&&stack.peek() < nums[i]){
                // 找到满足k < nums[b]
                // 只有出来的元素才能成为次大值，前面永远都有一个nums[b]
                k = Math.max(k,stack.pop());
            }
            // 为了保证每一个元素都有可能是次大值
            stack.push(nums[i]);
        }

        System.out.println("NO");
    }

    static class Input {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

        public int nextInt() {
            try {
                in.nextToken();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return (int) in.nval;
        }
    }
}
